/*
* @Author: MR.Sun
* @Date: 2022/8/24 09:12
* @File: main.go
* @Desc: fmt 一些打印方法汇总

注意，只要满足io.Writer接口的类型都支持写入。

*/
package main

import (
	"errors"
	"fmt"
	"os"
)

// 输出的一些展示
func stdOutPrint() {
	/* Print系列函数会将内容输出到系统的标准输出，
	* 区别在于Print函数直接输出内容，
	* Printf函数支持格式化输出字符串，
	* Println函数会在输出内容的结尾添加一个换行符。
	 */
	fmt.Print("终端打印。。。")
	name := "Mr.sun"
	fmt.Printf("我是 %s\n", name)
	fmt.Println("单独打印一行")

	/*
	* Fprint系列函数会将内容输出到一个io.Writer接口类型的变量w中，我们通常用这个函数往文件中写入内容。
	* Fprint,Fprintf,Fprintln
	 */
	fmt.Println("===== >>>>>")
	fmt.Fprintln(os.Stdout, "终端标准输出")
	fileObj, err := os.OpenFile("./2.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("打开文件err", err)
		return
	}
	fmt.Fprintf(fileObj, "写入文件信息: %s", name)

	/*
	* Sprint 系列函数会把传入的数据生成并返回一个字符串
	* Sprint,Sprintf,Sprintln
	* 可以理解为拼接字符串
	 */
	s1 := fmt.Sprint("doudou")
	age := 18
	s2 := fmt.Sprintf("name :%s,age:%d", name, age)
	s3 := fmt.Sprintln("hou")
	fmt.Println(s1, s2, s3)

	/*
	*	Errorf 打印错误
	 */
	e := fmt.Errorf("这是一个错误")
	fmt.Println(e)
	// Go1.13版本为fmt.Errorf函数新加了一个%w占位符用来生成一个可以包裹Error的Wrapping Error。
	err = errors.New("原始错误信息")
	e2 := fmt.Errorf("wrap 了一个错误 %w", err)
	fmt.Println(e2)
}

/*
占位符

*/

func PlaceholderPractice() {
	// 通用占位符
	fmt.Printf("%v\n", 100)
	fmt.Printf("%")
	name1 := struct {
		name string
	}{"sunshicheng"}
	fmt.Printf("%#v", name1)
	fmt.Printf("%T", name1)
	fmt.Printf("100%%\n")
}

func main() {
	stdOutPrint()
	PlaceholderPractice()

}
